package com.qvtu.poetry.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qvtu.poetry.entry.Result;
import com.qvtu.poetry.entry.User;
import com.qvtu.poetry.entry.dto.UserRegisterDTO;
import com.qvtu.poetry.entry.dto.UserUpdateDTO;
import com.qvtu.poetry.service.UserService;
import com.qvtu.poetry.mapper.UserMapper;
import com.qvtu.poetry.utils.JwtUtil;
import com.qvtu.poetry.utils.ThreadLocalUtil;
import com.qvtu.poetry.utils.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

/**
 * @author zxz
 * @description 针对表【t_user(用户表)】的数据库操作Service实现
 * @createDate 2025-10-11 10:42:09
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private RedisUtil redisUtil;

    @Override
    public Result<String> loginAndGenToken(String password, String email) {
        // 1. 调用登录验证方法
        User loginUser = login(password, email);

        // 2. 判断登录结果
        if (loginUser != null) {
            // 3. 生成token
            Map<String, Object> claims = new HashMap<>();
            claims.put("userId", loginUser.getId());
            claims.put("username", loginUser.getEmail());
            // 4. 生成JWT
            String token = JwtUtil.genToken(claims);
            return Result.success(token);
        } else {
            return Result.error("账号(邮箱)或密码错误");
        }
    }

    @Override
    public Result<String> registerWithVerification(UserRegisterDTO userRegisterDTO) {
        // 1. 检查用户是否已存在
        if (findByUsername(userRegisterDTO.getUsername()) != null) {
            return Result.error("用户名已存在");
        }

        // 2. 检查邮箱是否已存在
        if (findByEmail(userRegisterDTO.getEmail()) != null) {
            return Result.error("邮箱已被注册");
        }

        // 3. 邮箱验证码验证
        // 3.1 redis获取验证码
        String redisCode = redisUtil.getVerificationCode("email:code:" + userRegisterDTO.getEmail());
        if (redisCode == null) {
            return Result.error("验证码过期，请检查邮箱");
        }

        // 3.2 判断验证码是否正确
        if (!redisCode.equals(userRegisterDTO.getEmailCode())) {
            return Result.error("验证码错误");
        }

        // 4. 转换DTO为实体
        User user = BeanUtil.copyProperties(userRegisterDTO, User.class);

        // 5. 注册用户
        boolean success = register(user);
        if (success) {
            return Result.success("注册成功");
        } else {
            return Result.error("注册失败");
        }
    }

    @Override
    public Result<User> getCurrentUserInfo() {
        // 1. 从拦截器设置的 ThreadLocal 中获取用户信息
        Map<String, Object> tokenMap = ThreadLocalUtil.get();
        if (tokenMap == null || tokenMap.get("userId") == null) {
            return Result.error("未登录或令牌无效");
        }

        // 2. 解析用户ID
        Long userId;
        try {
            userId = Long.parseLong(tokenMap.get("userId").toString());
        } catch (Exception e) {
            return Result.error("用户ID解析失败");
        }

        // 3. 查询用户信息
        User user = getById(userId);
        if (user == null) {
            return Result.error("用户不存在");
        }

        // 4. 隐私字段处理
        user.setPassword(null);
        return Result.success(user);
    }

    @Override
    public Result<String> updateCurrentUserInfo(UserUpdateDTO userUpdateDTO) {
        // 1. 从拦截器设置的 ThreadLocal 中获取用户信息
        Map<String, Object> tokenMap = ThreadLocalUtil.get();
        if (tokenMap == null || tokenMap.get("userId") == null) {
            return Result.error("未登录或令牌无效");
        }

        // 2. 解析用户ID
        Long userId;
        try {
            userId = Long.parseLong(tokenMap.get("userId").toString());
        } catch (Exception e) {
            return Result.error("用户ID解析失败");
        }

        // 3. 调用服务层更新用户信息
        boolean success = updateUserInfo(userId, userUpdateDTO);
        if (success) {
            return Result.success("用户信息更新成功");
        } else {
            return Result.error("用户信息更新失败");
        }
    }

    @Override
    public User login(String password, String email) {
        User user = null;
        try {
            // 数据库操作
            user = userMapper.findByEmail(email);
        } catch (Exception e) {
            // 记录错误并返回错误响应
            e.printStackTrace();
        }
        if (user != null && user.getPassword().equals(password)) {
            return user;
        }
        return null;
    }

    @Override
    public boolean register(User user) {
        // 可以在这里对密码进行加密处理
        // user.setPassword(passwordEncoder.encode(user.getPassword()));
        try {
//  获取本地时间放入 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")  private LocalDateTime createTime;
            user.setCreateTime(LocalDateTime.now());
            user.setUpdateTime(LocalDateTime.now());
            user.setIsDeleted(0);
            user.setStatus(1);
            int insert = userMapper.insert(user);
            if (insert <= 0) {
                return false;
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public User findByUsername(String username) {
        return userMapper.findByUsername(username);
    }

    @Override
    public User findByEmail(String email) {
        return userMapper.findByEmail(email);
    }

    @Override
    public boolean updateUserInfo(Long userId, UserUpdateDTO userUpdateDTO) {
        // 1. 校验 userId 和 userUpdateDTO 非空
        if (userId == null || userUpdateDTO == null) {
            return false;
        }

        User user = new User();
        user.setId(userId);

        // 2. 对每个字段进行非空且非空字符串判断，仅复制有效数据
        if (userUpdateDTO.getUsername() != null && !"".equals(userUpdateDTO.getUsername().trim())) {
            user.setUsername(userUpdateDTO.getUsername().trim());
        }
        // 2. 对每个字段进行非空且非空字符串判断，仅复制有效数据
        if (userUpdateDTO.getNickname() != null && !"".equals(userUpdateDTO.getNickname().trim())) {
            user.setNickname(userUpdateDTO.getNickname().trim());
        }
        if (userUpdateDTO.getEmail() != null && !"".equals(userUpdateDTO.getEmail().trim())) {
            user.setEmail(userUpdateDTO.getEmail().trim());
        }
        if (userUpdateDTO.getAvatarUrl() != null && !"".equals(userUpdateDTO.getAvatarUrl().trim())) {
            user.setAvatarUrl(userUpdateDTO.getAvatarUrl().trim());
        }
        // 若有其他字段（如 phone、hobby 等），同理添加判断

        // 3. 设置更新时间
        user.setUpdateTime(LocalDateTime.now());

        // 4. 执行更新（仅当有字段被修改时才执行，避免无意义操作）
        boolean update = updateById(user);
        return update;
    }

}




